# backend/modules/authentication/models.py
# 导入数据库扩展和获取北京时间的函数
from ...extensions import db, get_beijing_time
# 导入用于哈希密码的相关函数
from werkzeug.security import generate_password_hash, check_password_hash

# 定义用户模型类，继承自 db.Model
class User(db.Model):
    __tablename__ = 'users'  # 在数据库中指定该模型对应的表名为 'users'

    # 用户的唯一标识符，类型为整型，自动递增
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    # 用户名，长度最大为50个字符，唯一且不能为空
    username = db.Column(db.String(50), unique=True, nullable=False)
    # 存储用户密码的哈希值，不能为空
    password_hash = db.Column(db.String(256), nullable=False)
    # 用户角色，长度最大为20个字符，不能为空，可以是 '管理员' 或 '普通用户'
    role = db.Column(db.String(20), nullable=False)
    # 用户创建时间，默认值为当前北京时间
    created_at = db.Column(db.DateTime, default=get_beijing_time)

    # 定义与 UploadedFile 模型之间的一对多关系
    # 一个用户可以上传多个文件
    uploaded_files = db.relationship(
        'UploadedFile',  # 关联的模型名称
        back_populates='user',  # 反向引用用户
        cascade="all, delete-orphan"  # 启用级联操作，删除用户时也会删除相关的文件
    )

    # 定义设置密码的方法
    # 此方法将明文密码转换为哈希值并存储在 password_hash 字段
    def set_password(self, password):
        self.password_hash = generate_password_hash(password)  # 生成密码的哈希值并赋值给 password_hash

    # 定义检查密码的方法
    # 此方法判断输入的明文密码与存储的哈希值是否匹配
    def check_password(self, password):
        return check_password_hash(self.password_hash, password)  # 返回比较结果，True 或 False

    # 判断用户是否为特定用户名 'pzy'
    def is_pzy(self):
        return self.username == 'pzy'  # 如果用户名为 'pzy' 则返回 True，否则返回 False

    # 定义用户模型的字符串表示形式
    def __repr__(self):
        return f"<User {self.username} - {self.role}>"  # 返回包含用户名和角色的字符串表示
